home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dmake / save / var.c < prev    next >
Encoding:
C/C++ Source or Header  |  1992-10-27  |  2.3 KB  |  129 lines

  1.  
  2. /*
  3.  *  VAR.C
  4.  */
  5.  
  6. #include "defs.h"
  7. #ifdef AMIGA
  8. #include <dos/dos.h>
  9. #endif
  10.  
  11. Prototype void Initvar(void);
  12. Prototype Var *MakeVar(char *, char);
  13. Prototype Var *FindVar(char *, char);
  14. Prototype void AppendVar(Var *, char *, long);
  15.  
  16. List VarList;
  17.  
  18. void
  19. InitVar()
  20. {
  21.     NewList(&VarList);
  22. }
  23.  
  24. /*
  25.  *  create a variable, deleting any previous contents
  26.  */
  27.  
  28. Var *
  29. MakeVar(char *name, char type)
  30. {
  31.     Var *var;
  32.  
  33.     for (var = GetHead(&VarList); var; var = GetSucc(&var->var_Node)) {
  34.     if (var->var_Node.ln_Type == type && strcmp(var->var_Node.ln_Name, name) == 0) {
  35.         while (PopCmdListChar(&var->var_CmdList) != EOF)
  36.         ;
  37.         return(var);
  38.     }
  39.     }
  40.     var = malloc(sizeof(Var) + strlen(name) + 1);
  41.     clrmem(var, sizeof(Var));
  42.  
  43.     var->var_Node.ln_Name = (char *)(var + 1);
  44.     var->var_Node.ln_Type = type;
  45.     strcpy(var->var_Node.ln_Name, name);
  46.     NewList(&var->var_CmdList);
  47.     AddTail(&VarList, &var->var_Node);
  48.     return(var);
  49. }
  50.  
  51. Var *
  52. FindVar(char *name, char type)
  53. {
  54.     Var *var;
  55.  
  56.     for (var = GetHead(&VarList); var; var = GetSucc(&var->var_Node)) {
  57.     if (var->var_Node.ln_Type == type && strcmp(var->var_Node.ln_Name, name) == 0)
  58.         break;
  59.     }
  60.  
  61.     /*
  62.      *    check for local & env variable(s).  local variables under 2.04
  63.      *    or later only.
  64.      */
  65.  
  66.     if (var == NULL || var->var_Node.ln_Type == '0') {
  67. #ifdef AMIGA
  68.     if (Running2_04()) {
  69.         char *ptr;
  70.         long len;
  71.  
  72.         if (GetVar(name, (char *)&ptr, 2, 0) >= 0) {
  73.         len = IoErr();
  74.         ptr = malloc(len + 1);
  75.         if (GetVar(name, ptr, len + 1, 0) >= 0) {
  76.             var = MakeVar(name, '0');
  77.             AppendVar(var, ptr, strlen(ptr));
  78.         }
  79.         free(ptr);
  80.         }
  81.     } else {
  82.         BPTR lock;
  83.         long fh;
  84.         long size;
  85.  
  86.         if (lock = Lock("ENV:", SHARED_LOCK)) {
  87.         if (fh = Open(name, 1005)) {
  88.             Seek(fh, 0L, 1);
  89.             if ((size = Seek(fh, 0L, -1)) >= 0) {
  90.             char *ptr = malloc(size + 1);
  91.  
  92.             Read(fh, ptr, size);
  93.             ptr[size] = 0;
  94.  
  95.             var = MakeVar(name, '0');
  96.             AppendVar(var, ptr, strlen(ptr));
  97.             free(ptr);
  98.             }
  99.             Close(fh);
  100.         }
  101.         UnLock(lock);
  102.         }
  103.     }
  104. #else
  105.     {
  106.         char *ptr;
  107.  
  108.         if (ptr = getenv(name)) {
  109.         var = MakeVar(name, '0');
  110.         AppendVar(var, ptr, strlen(ptr));
  111.         }
  112.     }
  113. #endif
  114.     }
  115.     return(var);
  116. }
  117.  
  118.  
  119. void
  120. AppendVar(var, buf, len)
  121. Var *var;
  122. char *buf;
  123. long len;
  124. {
  125.     while (len--)
  126.     PutCmdListChar(&var->var_CmdList, *buf++);
  127. }
  128.  
  129.